﻿using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows;
using System.Runtime.InteropServices;
using Microsoft.VisualStudio.Shell.Interop;
using Microsoft.VisualStudio.Shell;
using EnvDTE;

namespace AssemblyInfoEditor
{
    /// <summary>
    /// This class implements the tool window exposed by this package and hosts a user control.
    ///
    /// In Visual Studio tool windows are composed of a frame (implemented by the shell) and a pane, 
    /// usually implemented by the package implementer.
    ///
    /// This class derives from the ToolWindowPane class provided from the MPF in order to use its 
    /// implementation of the IVsUIElementPane interface.
    /// </summary>
    [Guid("f78bf026-6626-4169-b393-1682f6911156")]
    public class AssemblyInfoEditorToolWindow : ToolWindowPane
    {
        private DTE ideObject;
        private bool isEditorOpen;

        /// <summary>
        /// Standard constructor for the tool window.
        /// </summary>
        public AssemblyInfoEditorToolWindow() : base(null)
        {
            // Set the window title reading it from the resources.
            this.Caption = Resources.ToolWindowTitle;
            // Set the image that will appear on the tab of the window frame
            // when docked with an other window
            // The resource ID correspond to the one defined in the resx file
            // while the Index is the offset in the bitmap strip. Each image in
            // the strip being 16x16.
            this.BitmapResourceID = 301;
            this.BitmapIndex = 1;

            ideObject = (DTE)AssemblyInfoEditorPackage.GetGlobalService(typeof(DTE));
            ideObject.Events.SolutionEvents.Opened += new _dispSolutionEvents_OpenedEventHandler(SolutionEvents_Opened);
            ideObject.Events.SolutionEvents.BeforeClosing += new _dispSolutionEvents_BeforeClosingEventHandler(SolutionEvents_BeforeClosing);
            ideObject.Events.SolutionEvents.ProjectAdded += new _dispSolutionEvents_ProjectAddedEventHandler(SolutionEvents_ProjectAdded);
            

            // This is the user control hosted by the tool window; Note that, even if this class implements IDisposable,
            // we are not calling Dispose on this object. This is because ToolWindowPane calls Dispose on 
            // the object returned by the Content property.

            if (ideObject.Solution.IsOpen)
            {
                openEditor();
            }
            else
            {
                closeEditor();
            }
        }

        void SolutionEvents_ProjectAdded(EnvDTE.Project Project)
        {
            openEditor();
        }

        void SolutionEvents_BeforeClosing()
        {
            closeEditor();
        }

        void SolutionEvents_Opened()
        {
            openEditor();
        }

        void openEditor()
        {
            // Only open the editor if it's not already open
            if (!isEditorOpen)
            {
                base.Content = null;
                base.Content = new SettingsEditor();
                isEditorOpen = true;
            }
        }

        void closeEditor()
        {
            // Only close the editor if it's open
            if (isEditorOpen)
            {
                base.Content = null;
                base.Content = new SettingsUnavailableControl();
                isEditorOpen = false;
            }
        }
    }
}
